昨天已經成功建立一個資料庫 (database) 了,今天開始就會建立一個資料表 (table),並且將資料寫入這個資料表 (table)
也就是大家可能有聽過的 INSERT INTO SQL 指令
但是在這之前,我先再來回顧一下資料表 (table), 資料庫 (database),以及 關聯式資料庫管理系統 (RDBMS)
postgresql 來說他就是 RDBMS,而每個資料庫就是 關聯式資料庫  Relational Database
大家可以看到下圖是一個簡單的 資料表 (table)
他是由許多的單元格 (cell) 所組成,而這些單元格則是由列 (Row) 和 欄位 (column) 交集所產生的
但是這些單位都必須依靠 資料表 (table) 所產生的

所以我們可以知道一個資料庫是由很多的資料表產生的

很多的資料庫則被一個 PostgreSQL 服務所管理,形成一個資料庫叢集

所以我們可以知道雖然單元格 (cell) 是最小的單位,但是在 RDBMS 中資料表(table) 是基本的數據組織和存儲單位,由多個字段或單元格組成。
所以就讓我們來建立一個資料表吧
$ createdb demo_db
$ psql demo_db
demo_db=> CREATE TABLE books (
              author        varchar(80),
              title         varchar(80),
              price         int,
              create_at     date
          );
CREATE TABLE
你可以把上述內容在 psql 中輸入,包含換行字元不會影響判讀。psql 是以分號作為指令結束的判定
這邊我們以資料表 books 為例,通常會以複數為資料表的名字
varchar(80)  是一個資料型別, n 可以為任意數,它可以儲放任意 80 個字元以內的字串,是以 byte 為單位,繁體中文中的一個字不會為一個字,通常是佔 3 ~ 4 個 byte (1byte=8bits) (這邊以 ruby 的 irb 來驗證)

int 是一般認知的整數型別date 就是日期時間型別 格式為 YYYY-MM-DD
INSERT INTO 是 SQL 中用於向表中插入新行的指令。它可以用來添加單行或多行數據,並且提供了多種方式來指定要插入的數據。
為了排版方便,所以將 (你的資料庫名稱)=# 省略,下面的指令都是在 psql 的終端介面指令執行的喔
-- psql
demo_db=> INSERT INTO books (author, title, price, create_at) 
          values ('我是作者', '好看的書', 1000, '2023-09-19');
INSERT 0 1
INSERT 0 1,這代表資料有成功寫入資料庫了,那我們要怎麼驗證了,讓我們來使用 SELECT 語法吧demo_db=> SELECT * FROM books;
結果:
  author  |  title   | price | create_at
----------+----------+-------+------------
  我是作者  | 好看的書  | 1000  | 2023-09-19
(1 row)
這樣我們就可以成功的查詢到我們剛剛寫入的資料了
但是這樣好像有點不方便,是不是每次寫入資料都要再執行一次命令,好像有點麻煩,而且還要用 SELECT 去驗證一下,好麻煩,其實我們也是可以一次寫入很多比資料的
demo_db=> INSERT INTO books (author, title, price, create_at)
          VALUES 
          ('喬治·歐威爾', '1984', 9.99, '2021-01-01'),
          ('J.K 羅琳', '哈利波特', 12.99, '2022-02-15'),
          ('J·R·R·托爾金', '魔戒', 15.99, '2022-03-10');
RETURNING 子句用 RETURNING 字句,可以回傳剛剛執行的結果,也可以避免執行額外的資料庫查詢來收集資料,特別是在難以可靠地識別修改的資料列時尤其有用
以我們剛剛也寫入一筆有關書的資料為例,我們只要在後面加上 RETURNING *; (返回所有列) 就會返回剛剛寫入的資料
demo_db=> INSERT INTO books (author, title, price, create_at)
          VALUES ('我是作者', '我的書籍', 1999, '2023-09-19')
          RETURNING *;
結果:
  author  |  title   | price | create_at
----------+----------+-------+------------
 我是作者  | 我的書籍   | 1999  | 2023-09-19
(1 row)
INSERT 0 1
RETURNING (特定的欄位 多欄位可以 , 隔開) 返回特定列
--sql 
demo_db=> INSERT INTO books (author, title, price, create_at)
          VALUES ('我是作者', '我的書籍', 1999, '2023-09-19')
          RETURNING title, author;
結果:
  title   |  author
----------+----------
 我的書籍   | 我是作者
(1 row)
INSERT 0 1
demo_db=> INSERT INTO books (author, title, price, create_at)
          VALUES ('作者本人', '好貴的書', 10000, '2021-01-01')
          RETURNING author, title, price * 1.1 AS price_with_tax;
結果:
 author  |  title   | price_with_tax
----------+----------+----------------
 作者本人   | 好貴的書  |     11000.0
(1 row)
INSERT 0 1
加上了 RETURNING,我們就可以不用在另外使用 SELECT 查詢語句了,真是太棒了
$ DROP TABLE tablename;
若是你不需要這個資料表了,那麼我們就可以將它刪除了,但是基本上工作的時候不會用到這個指令,所以請小心使用。
那麼就來將剛剛所建立的資料表 books 刪除吧
demo_db=> DROP TABLE books
DROP TABLE
今天我們一起建立資料表(table),並且使用 SQL 語法 INSERT INTO 將資料寫入資料表中了,也就代表成功的將資料存到資料庫了。
明天我們就要將這些資料讀取出來 ![]()